home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 24 / CU Amiga Magazine's Super CD-ROM 24 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-07].iso / CUCD / Programming / EasyPLUGINs / source / poptask.e < prev    next >
Encoding:
Text File  |  1998-02-12  |  9.8 KB  |  416 lines

  1.  
  2. /*
  3.  
  4.     poptask_plugin: part of the EasyPLUGINs package
  5.  
  6.     TO DO:
  7.  
  8.         work out some scheme for size-ing listview gui to
  9.             match the strgadggets width
  10.         add app- stuff for strgadget ??
  11.  
  12. */
  13.  
  14. OPT MODULE, OSVERSION=37
  15.  
  16. ->> poptask_plugin: modules
  17.  
  18. MODULE 'tools/easygui', 'intuition/intuition',
  19.        'graphics/text', 'intuition/gadgetclass',
  20.        'gadtools', 'libraries/gadtools',
  21.        'utility', 'utility/tagitem',
  22.        'tools/textlen'
  23.  
  24. MODULE 'exec/nodes', 'exec/execbase', 'exec/lists',
  25.        'exec/tasks', 'amigalib/lists'
  26.  
  27. MODULE 'easyplugins/dclistview'
  28.  
  29. -><
  30.  
  31. ->> poptask_plugin: definitions
  32.  
  33. CONST NAME_LENGTH=64
  34.  
  35. EXPORT OBJECT poptask_plugin OF plugin PRIVATE
  36.  
  37.     but_contents:PTR TO CHAR
  38.     str_contents[NAME_LENGTH]:ARRAY OF CHAR
  39.     case_sensitive
  40.     remove_duplicates
  41.     listview_x, listview_y
  42.     disabled
  43.  
  44.     but_width
  45.  
  46.     gad_str:PTR TO gadget
  47.     gad_but:PTR TO gadget
  48.  
  49.     font:PTR TO textattr
  50.  
  51.     iaddress
  52.  
  53.     tasks:PTR TO mlh
  54.  
  55. ENDOBJECT
  56.  
  57. OBJECT task_node OF ln
  58.  
  59.     task_name[NAME_LENGTH]:ARRAY OF CHAR
  60.  
  61. ENDOBJECT
  62.  
  63. -> PROGRAMMER_ID | MODULE_ID
  64. ->      $01      |   $06
  65.  
  66.  
  67. EXPORT ENUM PLA_PopTask_ButtonText=$81006001,   ->[ISG]
  68.             PLA_PopTask_StringText,             ->[ISG]
  69.             PLA_PopTask_CaseSensitive,          ->[ISG]
  70.             PLA_PopTask_RemoveDuplicates,       ->[ISG]
  71.             PLA_PopTask_ListViewX,              ->[I..]
  72.             PLA_PopTask_ListViewY,              ->[I..]
  73.             PLA_PopTask_Disabled                ->[ISG]
  74.  
  75. -><
  76.  
  77. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  78.  
  79. ->> poptask_plugin: poptask() & end()
  80.  
  81. PROC poptask(tags:PTR TO tagitem) OF poptask_plugin
  82.  
  83.     IF utilitybase
  84.  
  85.         self.but_contents   := GetTagData(PLA_PopTask_ButtonText, 'Task...', tags)
  86.  
  87.         AstrCopy(self.str_contents, GetTagData(PLA_PopTask_StringText, '', tags))
  88.  
  89.         self.case_sensitive     := GetTagData(PLA_PopTask_CaseSensitive, FALSE, tags)
  90.         self.remove_duplicates  := GetTagData(PLA_PopTask_RemoveDuplicates, TRUE, tags)
  91.  
  92.         self.listview_x     := GetTagData(PLA_PopTask_ListViewX, 15, tags)
  93.         self.listview_y     := GetTagData(PLA_PopTask_ListViewY, 6, tags)
  94.  
  95.         self.disabled       := GetTagData(PLA_PopTask_Disabled, FALSE, tags)
  96.  
  97.     ELSE
  98.  
  99.         Raise("util")
  100.  
  101.     ENDIF
  102.  
  103.     NEW self.tasks
  104.  
  105.     newList(self.tasks)
  106.  
  107. ENDPROC
  108.  
  109. PROC end() OF poptask_plugin
  110.  
  111.     poptask_private_clear(self)
  112.  
  113.     END self.tasks
  114.  
  115. ENDPROC
  116. -><
  117.  
  118. ->> poptask_plugin: set() & get()
  119.  
  120. PROC set(attr, value) OF poptask_plugin
  121.  
  122.     SELECT attr
  123.  
  124.         CASE PLA_PopTask_ButtonText
  125.  
  126.             IF self.but_contents<>value
  127.  
  128.                 self.but_contents:=value
  129.  
  130.                 IF self.gad_but AND self.gh.wnd
  131.  
  132.                     Gt_SetGadgetAttrsA(self.gad_but, self.gh.wnd, NIL, [GA_TEXT, self.but_contents, TAG_DONE])
  133.  
  134.                 ENDIF
  135.  
  136.             ENDIF
  137.  
  138.         CASE PLA_PopTask_StringText
  139.  
  140.             IF self.str_contents<>value
  141.  
  142.                 AstrCopy(self.str_contents, value)
  143.  
  144.                 IF self.gad_str AND self.gh.wnd
  145.  
  146.                     Gt_SetGadgetAttrsA(self.gad_str, self.gh.wnd, NIL, [GTST_STRING, self.str_contents, TAG_DONE])
  147.  
  148.                 ENDIF
  149.  
  150.             ENDIF
  151.  
  152.         CASE PLA_PopTask_CaseSensitive
  153.  
  154.             IF self.case_sensitive<>value THEN self.case_sensitive:=value
  155.  
  156.         CASE PLA_PopTask_RemoveDuplicates
  157.  
  158.             IF self.remove_duplicates<>value THEN self.remove_duplicates:=value
  159.  
  160.         CASE PLA_PopTask_Disabled
  161.  
  162.             IF self.disabled<>value
  163.  
  164.                 self.disabled:=value
  165.  
  166.                 IF ((self.gad_str AND self.gad_but) AND self.gh.wnd)
  167.  
  168.                     Gt_SetGadgetAttrsA(self.gad_but, self.gh.wnd, NIL, [GA_DISABLED, self.disabled, TAG_DONE])
  169.                     Gt_SetGadgetAttrsA(self.gad_str, self.gh.wnd, NIL, [GA_DISABLED, self.disabled, TAG_DONE])
  170.  
  171.                 ENDIF
  172.  
  173.             ENDIF
  174.  
  175.     ENDSELECT
  176.  
  177. ENDPROC
  178.  
  179. PROC get(attr) OF poptask_plugin
  180.  
  181.     SELECT attr
  182.  
  183.         CASE PLA_PopTask_ButtonText;       RETURN self.but_contents, TRUE
  184.         CASE PLA_PopTask_StringText;       RETURN self.str_contents, TRUE
  185.         CASE PLA_PopTask_CaseSensitive;    RETURN self.case_sensitive, TRUE
  186.         CASE PLA_PopTask_RemoveDuplicates; RETURN self.remove_duplicates, TRUE
  187.         CASE PLA_PopTask_Disabled;         RETURN self.disabled, TRUE
  188.  
  189.     ENDSELECT
  190.  
  191. ENDPROC -1, FALSE
  192. -><
  193.  
  194. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  195.  
  196. ->> poptask_plugin: min_size() & will_resize()
  197. PROC min_size(ta:PTR TO textattr, fh) OF poptask_plugin
  198.  
  199.    self.but_width:=textlen(self.but_contents,ta)+8
  200.  
  201. ENDPROC (self.but_width+(fh*8)),(fh+6)
  202.  
  203. PROC will_resize() OF poptask_plugin IS RESIZEX
  204. -><
  205.  
  206. ->> poptask_plugin: gtrender() & clear_render()
  207. PROC gtrender(gl, vis, ta:PTR TO textattr, x, y, xs, ys, win:PTR TO window) OF poptask_plugin
  208.  
  209.     self.font:=ta
  210.  
  211.     self.gad_but:=CreateGadgetA(BUTTON_KIND, gl,
  212.                                 [x, y, self.but_width, ys, self.but_contents, ta, 1, 0, vis, 0]:newgadget,
  213.                                 [GA_DISABLED, self.disabled, TAG_DONE])
  214.  
  215.     self.gad_str:=CreateGadgetA(STRING_KIND, self.gad_but,
  216.                                 [x+self.but_width+1, y, xs-self.but_width, ys, NIL, ta, 2, 0, vis, 0]:newgadget,
  217.                                 [GA_DISABLED, self.disabled,
  218.                                  GTST_MAXCHARS, NAME_LENGTH,
  219.                                  GTST_STRING, self.str_contents,
  220.                                  TAG_DONE])
  221.  
  222. ENDPROC self.gad_str
  223.  
  224. PROC clear_render(win:PTR TO window) OF poptask_plugin
  225.  
  226.     IF self.gad_str THEN AstrCopy(self.str_contents, self.gad_str.specialinfo::stringinfo.buffer)
  227.  
  228. ENDPROC
  229.  
  230. -><
  231.  
  232. ->> poptask_plugin: message_test() & message_action()
  233. PROC message_test(imsg:PTR TO intuimessage, win:PTR TO window) OF poptask_plugin
  234.  
  235.     IF imsg.class=IDCMP_GADGETUP
  236.  
  237.         self.iaddress:=imsg.iaddress
  238.  
  239.         RETURN (imsg.iaddress=self.gad_but) OR (imsg.iaddress=self.gad_str)
  240.  
  241.     ENDIF
  242.  
  243. ENDPROC FALSE
  244.  
  245. PROC message_action(class, qual, code, win:PTR TO window) OF poptask_plugin
  246.  
  247.     DEF exec:PTR TO execbase, dclv:PTR TO dclistview,
  248.         fnode:PTR TO task_node, node:PTR TO task_node, sel, a,
  249.         found=FALSE
  250.  
  251.     IF self.iaddress=self.gad_but
  252.  
  253.         exec:=execbase
  254.  
  255.         Disable()
  256.  
  257.         poptask_private_snapshot(self, exec.taskwait.head)
  258.         poptask_private_snapshot(self, exec.taskready.head)
  259.  
  260.         Enable()
  261.  
  262.         blockwin(self.gh)
  263.  
  264.         IF fnode:=FindName(self.tasks, self.str_contents)
  265.  
  266.             node:=self.tasks.head; a:=0
  267.  
  268.             WHILE (node<>NIL) AND (found=FALSE)
  269.  
  270.                 IF fnode=node;  found:=TRUE
  271.                 ELSE;           node:=node.succ; a:=a+1
  272.                 ENDIF
  273.  
  274.             ENDWHILE
  275.  
  276.         ENDIF
  277.  
  278.         NEW dclv.dclistview([DCLV_RELX,    self.listview_x,
  279.                             DCLV_RELY,     self.listview_y,
  280.                             DCLV_LIST,     self.tasks,
  281.                             DCLV_CURRENT,  (IF fnode THEN a ELSE -1),
  282.                             DCLV_TOP,      (IF fnode THEN a ELSE 0),
  283.                             TAG_DONE])
  284.  
  285.         easyguiA(NIL, [DCLIST, {poptask_private_listclick}, dclv, TRUE],
  286.                       [EG_WTYPE,  WTYPE_NOBORDER,
  287.                        EG_SCRN,   win.wscreen,
  288.                        EG_FONT,   self.font,
  289.                        EG_LEFT,   (win.leftedge + self.x),
  290.                        EG_TOP,    (win.topedge + self.y + self.ys),
  291.                        TAG_DONE])
  292.  
  293.         sel:=dclv.get(DCLV_CURRENT)
  294.  
  295.         END dclv
  296.  
  297.         node:=self.tasks.head; a:=0
  298.  
  299.         WHILE node AND (a<sel)
  300.  
  301.             node:=node.succ; a:=a+1
  302.  
  303.         ENDWHILE
  304.  
  305.         IF node THEN self.set(PLA_PopTask_StringText, node.task_name)
  306.  
  307.         poptask_private_clear(self)
  308.  
  309.         unblockwin(self.gh)
  310.  
  311.     ELSEIF self.iaddress=self.gad_str
  312.  
  313.         AstrCopy(self.str_contents, self.gad_str.specialinfo::stringinfo.buffer)
  314.  
  315.     ENDIF
  316.  
  317.     self.iaddress:=NIL
  318.  
  319. ENDPROC TRUE
  320. -><
  321.  
  322. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  323.  
  324. ->> PRIVATE: clear(), snapshot() & compare()
  325. PROC poptask_private_clear(pt:PTR TO poptask_plugin)
  326.  
  327.     DEF node:PTR TO task_node, tnode:PTR TO task_node
  328.  
  329.     node:=pt.tasks.head
  330.  
  331.     WHILE tnode:=node.succ
  332.  
  333.         END node; node:=tnode
  334.  
  335.     ENDWHILE
  336.  
  337.     newList(pt.tasks)
  338.  
  339. ENDPROC
  340.  
  341. PROC poptask_private_snapshot(pt:PTR TO poptask_plugin, exectask:PTR TO tc)
  342.  
  343.   DEF tnode:PTR TO task_node, node:PTR TO task_node,
  344.       inserting, result
  345.  
  346.     WHILE exectask.ln.succ
  347.  
  348.         NEW tnode
  349.  
  350.         AstrCopy(tnode.task_name, exectask.ln.name, NAME_LENGTH)
  351.         tnode.name:=tnode.task_name
  352.  
  353.         node:=pt.tasks.head
  354.  
  355.         IF (poptask_private_compare(pt, node.task_name, tnode.task_name)>0)
  356.  
  357.             AddHead(pt.tasks, tnode)
  358.  
  359.         ELSE
  360.  
  361.             inserting:=TRUE
  362.  
  363.             WHILE node.succ AND inserting
  364.  
  365.                 node:=node.succ
  366.  
  367.                 result:=poptask_private_compare(pt, node.task_name, tnode.task_name)
  368.  
  369.                 IF (result=0) AND pt.remove_duplicates
  370.  
  371.                     inserting:=FALSE
  372.  
  373.                 ELSEIF (result>0)
  374.  
  375.                     Insert(pt.tasks, tnode, node.pred)
  376.  
  377.                     inserting:=FALSE
  378.  
  379.                 ENDIF
  380.  
  381.             ENDWHILE
  382.  
  383.             IF inserting=TRUE THEN AddTail(pt.tasks, tnode)
  384.  
  385.         ENDIF
  386.  
  387.         exectask:=exectask.ln.succ
  388.  
  389.     ENDWHILE
  390.     
  391. ENDPROC
  392.  
  393. PROC poptask_private_compare(pt:PTR TO poptask_plugin, s:PTR TO CHAR, t:PTR TO CHAR)
  394.  
  395. ENDPROC (IF pt.case_sensitive THEN Stricmp(s, t) ELSE Strnicmp(s, t, NAME_LENGTH))
  396. -><
  397.  
  398. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  399.  
  400. ->> PRIVATE: poptask_private_listclick()
  401.  
  402. PROC poptask_private_listclick(gh:PTR TO guihandle, dclv:PTR TO dclistview)
  403.  
  404.     DEF bool=FALSE, valid=FALSE
  405.  
  406.     bool, valid:=dclv.get(DCLV_CLICK)
  407.  
  408.     IF bool AND valid THEN quitgui()
  409.  
  410. ENDPROC
  411.  
  412. -><
  413.  
  414. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  415.  
  416.